package com.demo.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * @author linchong
 * @version 1.0
 * @Date: 2022-05-14 14:27
 * @Description: FieldCollector$
 *
 * 1. 批量的操作
 *  1）Field[] getFields():获取所有的“公有字段”
 *  2）Field[] getDeclaredFields(),获取所有字段，含私有、受保护、默认、公有,不能获取继承的字段
 * 2. 获取单个字段
 *  1）public Field getField(String fieldName):获取某个“公有的”字段
 *  2）public Field getDeclaredField(String fieldName):获取某个字段（可以私有）,不能获取继承的字段
 *
 * 设置字段字段的值
 *  Field -> public void set(Object obj,Object value);
 *      参数说明：
 *      1.obj:要设置的字段所在的对象
 *      2.value:要为字段设置的值
 *
 */
public class FieldCollector {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
		//获取class对象
		Class reflectTarget = Class.forName("com.demo.reflect.ReflectTarget");
		//1.获取所有公有的字段
		System.out.println("*************获取所有公有字段*************");
		Field[] fields = reflectTarget.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		//2.获取所有字段
		System.out.println("**************获取所有字段*************");
		fields = reflectTarget.getDeclaredFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		//3.获取某个具体公有属性字段
		System.out.println("**************获取某个公有属性字段*************");
		Field f = reflectTarget.getField("name");
		System.out.println("公有字段，"+f);
		ReflectTarget instance = (ReflectTarget) reflectTarget.getConstructor().newInstance();
		//给获得的字段赋值
		f.set(instance,"测试的值");
		System.out.println("name is "+instance.getName());
		//4.获取某个具体私有属性字段
		System.out.println("**************获取某个私有属性字段*************");
		f = reflectTarget.getDeclaredField("targetInfo");
		System.out.println(f);
		f.setAccessible(true);
		f.set(instance,"test");
		System.out.println("targetInfo:"+instance);

	}
}
